#ifndef __DAGMTX_HASH_FUNCTIONS_DOT_H__
#define __DAGMTX_HASH_FUNCTIONS_DOT_H__
#ifdef  __USE_USO__
#include <Types.h>
#include <BasicDagLibrary.h>
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
namespace boost {
   template<> struct hash< BNode > {
      size_t operator()( const BNode & x ) const {

         LSU u;
         u.l = x.l[0];
         
         return hash< U64 >()( u.l );
      }
   };
   template<> struct hash< QNode > {
      size_t operator()( const QNode & x ) const {

         LSU u0;
         LSU u1;
         
         u0.l = x.l[0];
         u1.l = x.l[1];
         
         size_t h = 0;
         h ^= hash< U64 >()( u0.l );
         h ^= hash< U64 >()( u1.l );
         return h;
      }
   };
   template<> struct hash< ONode > {
      size_t operator()( const ONode & x ) const {

         LSU u0;
         LSU u1;
         LSU u2;
         LSU u3;
         
         u0.l = x.l[0];
         u1.l = x.l[1];
         u2.l = x.l[2];
         u3.l = x.l[3];
         
         size_t h = 0;
         h ^= hash< U64 >()( u0.l );
         h ^= hash< U64 >()( u1.l );
         h ^= hash< U64 >()( u2.l );
         h ^= hash< U64 >()( u3.l );
         return h;
      }
   };
   template<> struct hash< Coordinate > {
      size_t operator()( const Coordinate & x ) const {
         
         size_t h = 0;
         h ^= hash< U64 >()( x.row );
         h ^= hash< U64 >()( x.col );
         return h;
      }
   };
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#endif
#endif
